package com.jymj.service.impl;

import com.jymj.dao.EnviorFileDao;
import com.jymj.entity.RenovatedFile;
import com.jymj.entity.SysUserEntity;
import com.jymj.entity.dto.EnviorFileDto;
import com.jymj.entity.fhtnty.EnviorFileFhEntity;
import com.jymj.entity.landmanage.PjEnviorFileEntity;
import com.jymj.service.EnviorFileService;
import com.jymj.utils.RRException;
import com.jymj.utils.ShiroUtils;
import com.jymj.utils.ZipFileUtiles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

@Service("EnviorFileService")
@PropertySource("classpath:/config/filePath.properties")
@Transactional
public class EnviorFileServiceImpl implements EnviorFileService {
    @Autowired
    private EnviorFileDao enviorFileDao;

    @Override
    public PjEnviorFileEntity queryObject(Integer id) {
        return enviorFileDao.queryObject(id);
    }

    @Override
    public void delete(Integer id) {
        enviorFileDao.delete(id);
    }

    @Override
    public List<PjEnviorFileEntity> queryObjectBymsId(int msid) {
        return enviorFileDao.queryObjectBymsId(msid);
    }

    @Override
    public int queryListByMsFltp(Integer msid, Integer fileType) {
        Map map = new HashMap();
        map.put("msid",msid);
        map.put("fileType",fileType);
        return enviorFileDao.queryListByMsFltp(map);
    }


    @Override
    public void save(PjEnviorFileEntity pjEnviorFileEntity) {
        enviorFileDao.save(pjEnviorFileEntity);
    }

    @Override
    public List<PjEnviorFileEntity> queryListByMsids(Long[] ids) {
        return enviorFileDao.queryListByMsids(ids);
    }

    @Override
    public void updateMsid(Integer msid, Integer[] fileIds) {
        Map map = new HashMap();
        map.put("msid",msid);
        map.put("fileIds",fileIds);
        enviorFileDao.updateMsid(map);
    }

    @Override
    public void saveRejectedFile(Integer rid, Integer eid) {
        enviorFileDao.saveRejectedFile(rid,eid);
    }

    @Override
    public void deleteBh(Integer id) {
        enviorFileDao.deleteBh(id);
    }

    @Override
    public List<PjEnviorFileEntity> queryAllPic(String date,String code,Integer hjzzsj,
                                                Integer integer,Integer[] hjzzsjs,Integer type) {
        Map map = new HashMap();
        map.put("date",date);
        map.put("code",code);
        map.put("hjzzsj",hjzzsj);
        map.put("cnw",integer);
        map.put("hjzzsjs",hjzzsjs);
        map.put("type",type);
        return enviorFileDao.queryAllPic(map);
    }

    @Override
    public List<Integer> queryHjzzsj(String date, String code,Integer integer,
                                     Integer type,Integer[] hjzzsjs) {
        Map map = new HashMap();
        map.put("date",date);
        map.put("code",code);
        map.put("cnw",integer);
        map.put("type",type);
        map.put("hjzzsjs",hjzzsjs);
        return enviorFileDao.queryHjzzsj(map);
    }

    @Override
    public List<EnviorFileFhEntity> queryListByType(EnviorFileDto enviorFileDto) {
        List<EnviorFileFhEntity> enviorFileFhEntities = enviorFileDao.queryListByType(enviorFileDto);
        for (EnviorFileFhEntity enviorFileFhEntity : enviorFileFhEntities) {
            enviorFileDto.setLocation(enviorFileFhEntity.getLocation());
            EnviorFileFhEntity entity = enviorFileDao.queryByPoint(enviorFileDto);
            enviorFileFhEntity.setPath(entity.getPath());
            enviorFileFhEntity.setLocation(entity.getLocation());
        }
        return enviorFileDao.queryListByType(enviorFileDto);
    }

    @Override
    public List<EnviorFileFhEntity> queryListByType1(EnviorFileDto enviorFileDto) {
        return enviorFileDao.queryListByType1(enviorFileDto);
    }

    @Override
    public List<EnviorFileFhEntity> queryListByType2(EnviorFileDto enviorFileDto) {
        List<EnviorFileFhEntity> enviorFileFhEntities = enviorFileDao.queryListByType2(enviorFileDto);
        for (EnviorFileFhEntity enviorFileFhEntity : enviorFileFhEntities) {
            enviorFileDto.setName(enviorFileFhEntity.getName());
            EnviorFileFhEntity entity = enviorFileDao.queryZhen(enviorFileDto);
            enviorFileFhEntity.setPath(entity.getPath());
        }
        return enviorFileFhEntities;
    }

    @Override
    public List<EnviorFileFhEntity> queryListByType3(EnviorFileDto enviorFileDto) {
        List<EnviorFileFhEntity> enviorFileFhEntities = enviorFileDao.queryListByType3(enviorFileDto);
        for (EnviorFileFhEntity enviorFileFhEntity : enviorFileFhEntities) {
            enviorFileDto.setName(enviorFileFhEntity.getName());
            EnviorFileFhEntity entity = enviorFileDao.queryCun(enviorFileDto);
            enviorFileFhEntity.setPath(entity.getPath());
        }
        return enviorFileFhEntities;
    }

    @Override
    public List<Integer> queryCnw(String date, String code) {
        return enviorFileDao.queryCnw(date,code);
    }

    @Override
    public List<PjEnviorFileEntity> queryList(EnviorFileDto enviorFileDto) {
        return enviorFileDao.queryList(enviorFileDto);
    }

    @Override
    public void zipMothPic(File toPath, File zipPath) {
        ZipFileUtiles.zipFilePath(toPath.getAbsolutePath(), zipPath.getAbsolutePath());
    }

    @Override
    public void saveRejectedFile5_4(Integer rid, Integer eid) {
        enviorFileDao.saveRejectedFile5_4(rid,eid);
    }


    @Value("${image.point_record.dirPath}")
    private String dirPath;
    @Value("${image.point_record.urlPath}")
    private String urlPath;
    @Override
    public RenovatedFile uploadPointFile(MultipartFile file, Integer type) {
        if (type==null)throw new RRException("type 参数不能为空");
        RenovatedFile renovatedFile = new RenovatedFile();
        SysUserEntity userEntity = ShiroUtils.getUserEntity();
        File genPath = null;
        try {
            genPath = new File(ResourceUtils.getURL("classpath:").getPath());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            throw new RRException("获取文件路径失败 请联系管理员" + e.getMessage());
        }
        if (!genPath.exists()) {
            genPath = new File("");
        }
        //在开发测试模式时，得到地址为：{项目跟目录}/target/progress/
        //在打成jar正式发布时，得到的地址为:{发布jar包目录}/progress/
        File savePath = new File(genPath.getAbsolutePath(), "fileupload" + File.separator + dirPath);

        //1.校验图片类型是否正确 jpg|png|gifxxxx  1.正则表达式判断  2.准备集合之后进行校验Set<去重>
        //1.1 获取上传的图片类型 ABC.JPG
        String fileName = file.getOriginalFilename();  //文件的全名 abc.jpg
        fileName = fileName.toLowerCase();                   //将所有的字符转化为小写
        int index = fileName.lastIndexOf(".");
        String fileType = fileName.substring(index);  //含头不含尾

        //2.上传的数据是否为恶意程序. 高度和宽度是否为null. 利用图片API
        //BufferedImage对象 专门负责封装图片
        try {
            //3.采用分目录存储的方式  a.jpg
            //3.1 分目录存储方式1 hash方式 ACBBCDD
            //3.1 分目录存储方式2 时间方式存储 yyyy/MM/dd
            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
            //3.2 准备文件存储的目录
            String imageDir = savePath.getParent() + File.separator + dirPath + dateDir;
            File fileDir = new File(imageDir);
            if (!fileDir.exists()) {
                fileDir.mkdirs();
            }

            //4 实现文件上传
            //4.1 动态拼接文件名称   uuid.后缀  f3aa1378-ece6-11ea-98c9-00d861eaf238
            String uuid =
                    UUID.randomUUID().toString().replace("-", "");
            String realFileName = uuid + fileType;
            //4.2 准备文件上传的全路径  磁盘路径地址+文件名称
            File imageFile = new File(imageDir + realFileName);
            //4.3 实现文件上传
            file.transferTo(imageFile);
            //5.动态生成URL地址
            //请求协议: http://  https:// 带证书的网址 安全性更高 公钥私钥进行加密解密.
            //向服务器运行商购买域名  com  cn  org   hosts文件
            //图片存储的虚拟地址的路径 动态变化的路径
            String url = urlPath + dateDir + realFileName;
            renovatedFile.setName(fileName)
                    .setPath(imageDir + realFileName)
                    .setUrl(url)
                    .setEnpsn(userEntity.getUserId())
                    .setEntime(new Date())
                    .setJlrname(userEntity.getName())
                    .setJlrtel(userEntity.getMobile())
                    .setMsid(-1L)
                    .setFiletype(type);
            enviorFileDao.saveFile(renovatedFile);
            return renovatedFile.setPath(null);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RRException("图片上传失败");
        }
    }

    @Override
    public void deletePointFile(Long[] ids) {
        if (ids == null || ids.length <= 0) {
            throw new RRException("ids不能为空");
        }
        List<RenovatedFile> files = enviorFileDao.getFiles(ids, null);
        if (files.size() < 1) throw new RRException("删除的文件可能已经不存在");
        files.forEach(file -> new File(file.getPath()).delete());
        enviorFileDao.deletefileById(ids);
    }


}
